package com.easyctba.core.algorithm.exec;

import com.easyctba.core.enums.PythonConfig;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;

public class StExec {
    /**
     * st表生成
     * @param list 分析序列
     * @param interval 分析间隔
     * @param id 分析全局唯一id
     * @return st表在oss的路径
     */
    public String stTable(List<String> list, Long interval, Long id){
       String pythonPath =PythonConfig.basePath+"st/st_table.py";
        // 参数1：数据列表 参数2采样间隔 参数3：st分析id用作文件名
        String[] args1 = new String[]{PythonConfig.localPython, pythonPath, list.toString(), String.valueOf(interval), String.valueOf(id)};
        try {
            // 执行Python文件，并传入参数
            Process process = Runtime.getRuntime().exec(args1);
            // 获取Python输出字符串作为输入流被Java读取
            BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream(), StandardCharsets.UTF_8));
            String actionStr = in.readLine();
            if (actionStr != null) {
                System.out.println(actionStr);
            }
            in.close();
            int i = process.waitFor();
            System.out.println(i);
            return actionStr;
        } catch (IOException | InterruptedException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * rt值的计算
     * @param list 分析序列
     * @return rt值
     */
    public Double rt(List<String> list){
        double length = list.size();
        double t = list.stream().filter(i -> i.equals("T")).count();
        return t/length;
    }
    /**
     * ch值的计算
     * @param list 分析序列
     * @return rt值
     */
    public Double ch(List<String> list){
        double length = list.size();
        Deque<String> temp = new ArrayDeque<>();
        long count=0;
        for (String s : list) {
            if (temp.isEmpty()){
                //栈为空
                temp.push(s);
                count++;
            }else {
                //与上个元素相同，插入栈
                if (s.equals(temp.peek())){
                    temp.push(s);
                }else {
                    //与上个元素不同，计数器+1，栈清空
                    temp.clear();
                    count++;
                    temp.push(s);
                }
            }
        }
        return (count-1)/length;
    }

    /**
     * 教学模式
     * @param rt rt值
     * @param ch ch值
     * @return 教学模式
     */
    public String mode(double rt,double ch){
        StringBuilder sb = new StringBuilder();
        List<String> list = new ArrayList<>();
        if (rt<=0.3){
            list.add("练习型");
        }
        if (rt>=0.7){
            list.add("讲授型");
        }
        if (ch>=0.4) {
            list.add("对话型");
        }
        if (rt>0.3 && rt<0.7 && ch<0.4){
            list.add("混合型");
        }
        for(String s:list){
            if (!sb.isEmpty()){
                sb.append("，");
            }
            sb.append(s);
        }
        return sb.toString();
    }
}
